import sys
import os
import subprocess


class CrossFolderCaller:
    def __init__(self, base_folder):
        """
        初始化类，并指定基文件夹的路径。
        :param base_folder: 跨文件夹调用时的基准文件夹
        """
        self.base_folder = os.path.abspath(base_folder)
        if not os.path.exists(self.base_folder):
            raise FileNotFoundError(f"The base folder '{self.base_folder}' does not exist.")
    
    def add_to_sys_path(self, folder_name):
        """
        将子文件夹添加到 sys.path 中，用于模块导入。
        :param folder_name: 要添加到 sys.path 的文件夹名称
        """
        folder_path = os.path.join(self.base_folder, folder_name)
        if os.path.exists(folder_path):
            sys.path.append(folder_path)
            print(f"Added {folder_path} to sys.path.")
        else:
            raise FileNotFoundError(f"The folder '{folder_name}' does not exist in base folder.")
    
    def run_script(self, script_name, folder_name="", args=None):
        """
        执行其他文件夹中的 Python 脚本。
        :param script_name: 脚本文件的名称
        :param folder_name: 脚本所在的文件夹名称
        :param args: 脚本的参数（可选）
        """
        script_path = os.path.join(self.base_folder, folder_name, script_name)
        if not os.path.exists(script_path):
            raise FileNotFoundError(f"The script '{script_name}' does not exist in folder '{folder_name}'.")

        command = ['python', script_path]
        if args:
            command.extend(args)
        
        print(f"Running script: {command}")
        subprocess.run(command, check=True)
    
    def import_module(self, module_name, folder_name=""):
        """
        动态导入其他文件夹中的模块。
        :param module_name: 要导入的模块名称
        :param folder_name: 模块所在的文件夹名称
        :return: 导入的模块对象
        """
        folder_path = os.path.join(self.base_folder, folder_name)
        if os.path.exists(folder_path):
            sys.path.append(folder_path)
            print(f"Added {folder_path} to sys.path for module import.")
        
        try:
            module = __import__(module_name)
            print(f"Successfully imported module: {module_name}")
            return module
        except ImportError as e:
            print(f"Failed to import module '{module_name}': {e}")
            return None


# 示例使用
if __name__ == "__main__":
    # 假设我们有一个 base_folder 指向了项目根目录
    # base_folder = './project'
    base_folder = os.path.abspath('..')
    
    # 实例化类
    caller = CrossFolderCaller(base_folder)

    # 示例 1: 导入模块
    caller.add_to_sys_path('consumer')  # 添加模块所在的文件夹到 sys.path
    module = caller.import_module('module_in_a')  # 从 folder_a 中导入模块
    if module:
        module.some_function()  # 调用模块中的函数

    # 示例 2: 运行其他文件夹中的脚本
    caller.run_script('script_in_b.py', folder_name='folder_b', args=['arg1', 'arg2'])  # 从 folder_b 运行 script
